#pragma once 
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
#define int long long
#define RNT register int

using namespace std;
const int maxn=2e5+5;
int dep[maxn];
int p[maxn],tag[maxn];
int elast[maxn];
struct Edge {
	int u,v,w,nXt;
} e[maxn];
int E=0;
void get_add(RNT u,RNT v) {
	e[++E].u=u;
	e[E].v=elast[v];
	elast[v]=E;
}
void dfs(RNT x,RNT fa) {
	// dep[x]=fa+1;
	dep[x]=fa;
	for( RNT i=elast[x]; i; i=e[i].v) {
		RNT y=e[i].u;
		if(y==fa) continue;
		dfs(y,x);
	}
	
}
int read() {
	int r=0,f=1;
	char c=getchar();
	while((c<'0'||c>'9')&&c!='-')c=getchar();
	if(c=='-')f=-1,c=getchar();
	while(c>='0'&&c<='9')r=r*10+c-'0',c=getchar();
	return r*f;
}
int getsum(RNT x) {
	RNT ans=0,tmp=1;
	while(x) ans+=p[x]+tmp++*tag[x],x=dep[x];
	return ans;
}
int read_() {
	RNT x;
	scanf("%lld",&x);
//	scanf("%d",&x);
	return x;
}
signed main() {
//	ios::sync_with_stdio(false);
	RNT n=read(),m=read();
	for(RNT i=1ll; i<=n; i++) p[i]=read();
	for(RNT i=1ll,u=0ll,v=0ll; i<(int)n; i++) {
		u=read(),v=read();
		get_add(u,v);
		get_add(v,u);
	}
	dfs(1ll,-0ll);
	for(RNT i=1; i<=m; i++) {
		RNT ans=0ll,y;
		RNT way=read(),x=read();
		if(way==3ll) {
			printf("%lld\n",getsum(x));
//			printf("%d\n",getsum(x));
		} else {
			y=read();
			if(way==1ll) p[x]+=y;
			else tag[x]+=y;
		}
	}
}